<?php
class Data
{
    private $dataBr = '/^\d{2}\/\d{2}\/\d{4}$/';
    private $dataEn = '/^\d{4}\-\d{2}\-\d{2}$/';
    
    public function dataCompleta( $data = null, $linguaSigla = 'br' )
    {
        
        if ( preg_match($this->dataBr, $data) )
        {
            $dt = explode('/', $data);
            $datanova = $dt[2].'/'.$dt[1].'/'.$dt[0];
            $dia = date("d", strtotime($datanova));
            $mesN = date('m', strtotime($datanova));
            $ano = date('Y', strtotime($datanova));
            $semanaN = date('w', strtotime($datanova));
        }
        else if ( preg_match($this->dataEn, $data) )
        {
            $dia = date("d", strtotime($data));
            $mesN = date('m', strtotime($data));
            $ano = date('Y', strtotime($data));
            $semanaN = date('w', strtotime($data));
        }
        else
        {
            $dia = date("d");
            $mesN = date('m');
            $ano = date('Y');
            $semanaN = date('w');
        }
        
        if($linguaSigla == 'en'){
            $test_c = abs($dia) % 10; 
            $ext = ((abs($dia) %100 < 21 && abs($dia) %100 > 4) ? 'th' : (($test_c < 4) ? ($test_c < 3) ? ($test_c < 2) ? ($test_c < 1) ? 'th' : 'st' : 'nd' : 'rd' : 'th')); 
            
            $dia .= $ext;
        }
        
        switch ( $mesN )
        {
            case 1 :
                $mes['br'] = "Janeiro";
                $mes['en'] = "January";
                $mes['es'] = "Enero";
                break;
            case 2 :
                $mes['br'] = "Fevereiro";
                $mes['en'] = "February";
                $mes['es'] = "Febrero";
                break;
            case 3 :
                $mes['br'] = "Março";
                $mes['en'] = "March";
                $mes['es'] = "Marzo";
                break;
            case 4 :
                $mes['br'] = "Abril";
                $mes['en'] = "April";
                $mes['es'] = "Abril";
                break;
            case 5 :
                $mes['br'] = "Maio";
                $mes['en'] = "May";
                $mes['es'] = "Mayo";
                break;
            case 6 :
                $mes['br'] = "Junho";
                $mes['en'] = "June";
                $mes['es'] = "Junio";
                break;
            case 7 :
                $mes['br'] = "Julho";
                $mes['en'] = "July";
                $mes['es'] = "Julio";
                break;
            case 8 :
                $mes['br'] = "Agosto";
                $mes['en'] = "August";
                $mes['es'] = "Agosto";
                break;
            case 9 :
                $mes['br'] = "Setembro";
                $mes['en'] = "September";
                $mes['es'] = "Septiembre";
                break;
            case 10 :
                $mes['br'] = "Outubro";
                $mes['en'] = "October";
                $mes['es'] = "Octubre";
                break;
            case 11 :
                $mes['br'] = "Novembro";
                $mes['en'] = "November";
                $mes['es'] = "Noviembre";
                break;
            case 12 :
                $mes['br'] = "Dezembro";
                $mes['en'] = "December";
                $mes['es'] = "Diciembre";
                break;
        }
        
        switch ( $semanaN )
        {
            case 0 :
                $semana['br'] = "Domingo";
                $semana['en'] = "Sunday";
                $semana['es'] = "Domingo";
                break;
            case 1 :
                $semana['br'] = "Segunda-feira";
                $semana['en'] = "Monday";
                $semana['es'] = "Lunes";
                break;
            case 2 :
                $semana['br'] = "Terça-feira";
                $semana['en'] = "Tuesday";
                $semana['es'] = "Martes";
                break;
            case 3 :
                $semana['br'] = "Quarta-feira";
                $semana['en'] = "Wednesday";
                $semana['es'] = "Miércoles";
                break;
            case 4 :
                $semana['br'] = "Quinta-feira";
                $semana['en'] = "Thursday";
                $semana['es'] = "Jueves";
                break;
            case 5 :
                $semana['br'] = "Sexta-feira";
                $semana['en'] = "Friday";
                $semana['es'] = "Viernes";
                break;
            case 6 :
                $semana['br'] = "Sábado";
                $semana['en'] = "Saturday";
                $semana['es'] = "Sábado";
                break;
        }
        
        $montaData['br'] = $semana['br'] . ", " . $dia . " de " . $mes['br'] . " de " . $ano;
        $montaData['en'] = $semana['en'] . ", " . $mes['en'] . ' ' . $dia . ', ' . $ano;
        $montaData['es'] = $semana['es'] . ", " . $dia . " de " . $mes['es'] . " de " . $ano;
        
        return $montaData[$linguaSigla];
    }
    
    /**
     * Método para verificar se data final é maior q data inicial.
     *
     * @param string $dataInicio Data inicial
     * @param string $dataFim Data final
     */
    public function VerificaDatas( $dataInicio, $dataFim, $aux = false )
    {
        
        if ( preg_match($this->dataBr, $dataInicio) )
        {
            $dInicio = explode("/", $dataInicio);
            $dFim = explode("/", $dataFim);
            
            $dInicio = mktime(0, 0, 0, $dInicio[1], $dInicio[0], $dInicio[2]);
            $dFim = mktime(0, 0, 0, $dFim[1], $dFim[0], $dFim[2]);
        }
        else if ( preg_match($this->dataEn, $dataInicio) )
        {
            $dInicio = explode("-", $dataInicio);
            $dFim = explode("-", $dataFim);
            
            $dInicio = mktime(0, 0, 0, $dInicio[1], $dInicio[2], $dInicio[0]);
            $dFim = mktime(0, 0, 0, $dFim[1], $dFim[2], $dFim[0]);
        }
        
        if ( $dInicio > $dFim )
            return false;
        
        return $dataFim;
    }
    
    /**
     * Método Responsavel por comparar 2 datas
     * 
     * @access public
     * @param array $dataInicio Data inicial
     * @param array $dataFim Data final
     * @param array $horaInicial Hora inicial, Parametro opcional
     * @param array $horaFinal Hora final, Parametro opcional
     * @return string se inicial for menor que final retorna 'menor' senão 'maior', ou 'igual'
     */
    public function VerificaDataHora( $dataInicio, $dataFim, $horaInicial = null, $horaFinal = null )
    {
        if ( preg_match($this->dataBr, trim($dataInicio) ) )
        {
            $dInicio = explode("/", $dataInicio);
            
            $Inicial['d'] = $dInicio[0];
            $Inicial['m'] = $dInicio[1];
            $Inicial['y'] = $dInicio[2];
        }
        else if ( preg_match($this->dataEn, trim($dataInicio)) )
        {
            $dInicio = explode("-", $dataInicio);
            
            $Inicial['d'] = $dInicio[1];
            $Inicial['m'] = $dInicio[2];
            $Inicial['y'] = $dInicio[0];
        }
        
        if ( preg_match($this->dataBr, trim($dataFim)) )
        {
            $dFim = explode("/", $dataFim);
            
            $Final['d'] = $dFim[0];
            $Final['m'] = $dFim[1];
            $Final['y'] = $dFim[2];
            
        }
        else if ( preg_match($this->dataEn, trim($dataFim)) )
        {
            $dFim = explode("-", $dataFim);
            
            $Final['d'] = $dFim[1];
            $Final['m'] = $dFim[2];
            $Final['y'] = $dFim[0];
            
        }
        
        if ( empty($horaInicial) )
        {
            $Inicial['h'] = 0;
            $Inicial['i'] = 0;
            $Inicial['s'] = 0;
        }
        else
        {
            $Inicial['h'] = date('H', strtotime($horaInicial));
            $Inicial['i'] = date('i', strtotime($horaInicial));
            $Inicial['s'] = date('s', strtotime($horaInicial));
        }
        
        if ( empty($horaFinal) )
        {
            $Final['h'] = 0;
            $Final['i'] = 0;
            $Final['s'] = 0;
        }
        else
        {
            $Final['h'] = date('H', strtotime($horaFinal));
            $Final['i'] = date('i', strtotime($horaFinal));
            $Final['s'] = date('s', strtotime($horaFinal));
        }
        
        /*echo "<pre>";
        print_r ($Inicial);
        print_r ($Final);
        echo "</pre>";
        exit; 
        print  "<br> -- " . $dInicio . " -- " . $dFim ;  exit;
         */
        $dInicio = mktime($Inicial['h'], $Inicial['i'], $Inicial['s'], $Inicial['m'], $Inicial['d'], $Inicial['y']);
        $dFim = mktime($Final['h'], $Final['i'], $Final['s'], $Final['m'], $Final['d'], $Final['y']);
        
        
        
        if ( $dInicio < $dFim )
        {
            return 'menor';
        }
        else if ( $dInicio == $dFim )
        {
            return 'igual';
        }
        else
        {
            return 'maior';
        }
    
    }
    
    /**
     * Metodo responsavel em retornar data em formato americano
     * Exemplo: 2010-23-12
     * 
     * @param string $data Data que deve ser formatada
     * @return string
     */
    public function FormataParaAmericano( $data )
    {
        if ( preg_match($this->dataBr, $data) )
        {
            $novaData = explode("/", $data);
            
            return "{$novaData[2]}-{$novaData[1]}-{$novaData[0]}";
        }
        else
        {
            return;
        }
    }
    
    /**
     * Metodo responsavel em retornar data em formato brasileiro
     * Exemplo: 12-05-2014
     * 
     * @param string $data Data que deve ser formatada
     * @return string
     */
    public function FormataData($data = null, $formato = 'br')
    {
        if ( preg_match($this->dataBr, $data) ){
            $dt = explode('/', $data);
            $datanova = $dt[2].'/'.$dt[1].'/'.$dt[0];
            $dia = date("d", strtotime($datanova));
            $mesN = date('m', strtotime($datanova));
            $ano = date('Y', strtotime($datanova));
        }else if ( preg_match($this->dataEn, $data) ){
            $dia = date("d", strtotime($data));
            $mesN = date('m', strtotime($data));
            $ano = date('Y', strtotime($data));
        }else{
            $dia = date("d");
            $mesN = date('m');
            $ano = date('Y');
        }
        
        if($formato == 'en'){
            $dataN = $ano.'/'.$mesN.'/'.$dia;
        }else{
            $dataN = $dia.'/'.$mesN.'/'.$ano;
        }
        
        return $dataN;
    }
}
?>